// 以前声明变量 var
// 为什么要有let & const

//TODO 1.污染全局变量 (常见的作用域 window,function,with)

// var a = 1;
// {
//   var a = 2;
// }
// console.log('a:', a); //2
// console.log(window.a); //2

let a = 1;
{
  let a = 2; //如果是编译成es5，可以发现它变成了 var _a = 2
}
console.log('a:', a); //1
// console.log(window.a); //undefined

//TODO 2.我们没有声明之前 会预先定义 变量提升(function var import)

// console.log(b); //undefined
// var b = 1

// console.log(b); //会报错 ReferenceError: b is not defined，如果编译成es5环境是不会报错的(因为都转成了var)
// let b = 2;

//TODO 3.var 可以被定义多次

//TODO 4.var 不能声明常量

// const obj = {};
// obj.a = 100;

//TODO 5.var 默认不会产生作用域(希望产生一个非全局作用域 可以使用let const 产生一个块级作用域{})

/*for (var i = 0; i < 10; i++) {
  setTimeout(() => {
    console.log(i); //10
  });
}*/

// let 不会污染全局变量 ，不存在变量提升,不能被重复定义(同一个作用域下不能重复定义)  let + {} 可以产生一个作用域，异步循环
for (let i = 0; i < 10; i++) {
  setTimeout(() => {
    console.log(i); //0、1、2...
  }); // 浏览器里 最小延时>=4ms
}
